草庐IT

C++ 11:std::thread池化?

全部标签

c++ - 将 OpenGL 模板功能移植到 DirectX 11

我有一些用OpenGL编写的渲染代码。我使用模板缓冲区来实现裁剪://Let'sassumethisisdoneinrenderloop.if(!already_created()){create_stencil_attachment_and_bind_to_FB_as_depth_stencil_attachment();}glEnable(GL_STENCIL_TEST);glColorMask(0,0,0,0);glDepthMask(0);glClearStencil(0);glClear(GL_STENCIL_BUFFER_BIT);glStencilFunc(GL_ALWA

c++ - <locale> 中的 "ctype"函数抛出 std::bad_cast

这个程序#include#includeintmain(){std::isxdigit(std::cin.peek(),std::cin.getloc());}抛出std::bad_cast类型的异常使用libstdc++使用gcc或clang编译时在我身上。用VS2010运行正常。我明白这里发生了什么。peek()返回int以适应带外EOF值。语言环境不需要ctype方面(他们在VS中确实有这个方面,也许作为扩展)。如果语言环境没有执行功能的方面,它将抛出bad_cast。.但这不应该按照原始的精神来工作吗??这是标准的缺陷吗?是否有普遍接受的解决方法?我知道我可以自己检查EOF并转

c++ - 高效的 const char* 连接和输出到 std::string

这个问题在这里已经有了答案:Mostoptimizedwayofconcatenationinstrings(9个回答)关闭9年前。首先要考虑的是,将存储在输出字符串中的总数据量几乎肯定很小,因此我怀疑其中任何一个都会对性能产生显着影响。我的主要目标是找到一种连接一系列大小未知的constchar*的方法,这种方法看起来并不糟糕,同时还要牢记效率。以下是我的搜索结果:方法一:std::stringstr=std::string(array1)+array2+array3;方法二:std::stringstr(array1);str+=array2;str+=array3;我决定使用第一

C++ 11 绑定(bind) std::function 与存储元组和解包

首先,我对C++11还是比较陌生,所以如果我遗漏了什么,请原谅我的疏忽。所以我想做的基本上是让调用者传入一个函数和该函数的任意参数,将其存储起来,然后稍后异步调用它。似乎有2个主要选项:使用std::bind将std::function绑定(bind)到它的参数(使用可变参数模板获得),然后稍后调用它将参数包转换为一个元组,存储它和std::function,然后再次将元组解压为多个参数并使用它调用函数问题是,一种方法比另一种更好吗?两者之间有优缺点/性能优势吗?谢谢!编辑:根据要求,这里有一个澄清,第一种情况是更早的绑定(bind),我将args绑定(bind)到函数,只要调用者传递

c++ - `std::vector` 在调整大小时抛出 "bad allocation"异常

我在C++dll中有以下代码,我通过JNI调用它:std::vectormyVector;myVector.resize(10000000,0);我收到“错误分配”异常,即使vector的最大大小应该大于10000000。我应该使用什么工具来跟踪内存分配,以便定位任何内存泄漏?如果真的没有内存泄漏,我该如何减少vector的占用空间以确保我有足够的空间? 最佳答案 我知道这可能是找出分配大小的最差解决方案。所以这里是:主要.cpp:#include"jni.h"#include#include#if(_MSC_VER==1800)|

c++ - std::max 与 lambda 和 auto

C++11难道不能做到这一点吗?使用当前的clang编译器(OSX10.8上的Xcode5)无法编译:std::max_element(group->GetComponents().begin(),group->GetComponents().end(),[](autoa,autob){returna.length>b.length;});错误信息是:Stuff.cp:68:40:函数原型(prototype)中不允许使用“auto” 最佳答案 在C++1y中你有通用的lambda,所以语法将在clang3.5中编译。.lambda

C++11 动态线程池

最近,我一直在尝试寻找一个线程化并发任务的库。理想情况下,一个在线程上调用函数的简单接口(interface)。任何时候都有n个线程,一些线程比其他线程完成得更快,并且到达时间不同。首先我尝试了Rx,它在C++中非常棒。我也研究过Blocks和TBB,但它们都依赖于平台。对于我的原型(prototype),我需要保持平台独立性,因为我们还不知道它将运行在什么平台上,并且在做出决定时可能会发生变化。C++11有很多关于线程和并发的东西,我发现了很多这样的线程池示例。https://github.com/bilash/threadpool类似的项目使用与std::thread和std::m

c++ - 来自 std::set insert() 和 find() 的写-写数据竞争?

为了试验线程清理器,我创建了一个微型C++程序,它有意包含一个数据竞争。确实,tsan确实检测到错误,太棒了!但是我对生成的消息感到困惑......它报告了一个写-写数据竞争,而我原以为是一个读-写竞争。我希望find()不会写入我的容器。如果我做进一步的小代码调整,试图获得set::find()的const版本,似乎仍然存在相同的写-写竞争。它显示了在同一地址的4字节原子写入和8字节写入之间的写入冲突。容器类中的同一个字段被两种不同的访问类型访问,这似乎很奇怪。是否可以选择使用不写入STL容器的constfind()?这是经过测试的C++程序:/*******************

c++ - c++11 中的 brace-init 是否存在任何效率问题?

我正在考虑重构一个中等规模的代码库,使其始终使用大括号初始化。有什么我应该注意的效率问题吗?一些示例可能是POD类型和内置类型,以及具有大量构造参数的大型类呢? 最佳答案 这取决于您所说的“始终使用大括号初始化”是什么意思。如果你像这样转换一个构造函数Xx(a,b,c);进入Xx{a,b,c};(并且行为不会因为选择了不同的构造函数而改变)那么生成的代码的效率应该不会提高或降低。另一方面:std::vectorv{"longcharacterstringa","longcharacterstringb","longcharacter

C++11 无锁自动更新 2 个变量

我想更新atomicX当一个线程找到一个新的最小值来改变它。当它确实设置了新的最小值时,我还想更改一个变量y,原子地。有没有办法在没有锁的情况下做到这一点?同时在多个线程上执行的线程函数示例:uint64_tx=atomicX;inty=g();for(intnewX=0;newX我可以这样使用锁:inty=g();for(uint64_tnewX=0;newX我也愿意接受任何更清晰的结构,或其他方式一起完成。我不喜欢我必须拥有相同的newX条件两次,否则我必须打破循环。 最佳答案 有一个相当简单且可能足够便携的解决方案,即使用指针